/*!
 * \file WTSRiskDef.hpp
 * \project	WonderTrader
 *
 * \author Wesley
 * \date 2020/03/30
 * 
 * \brief WonderTrader风控数据定义文件
 * 
 * \details 本文件定义了WonderTrader框架中风控系统相关的数据结构：
 *          - 交易统计信息：跟踪各品种的交易活动统计
 *          - 资金信息：管理账户资金状态和盈亏情况
 *          - 风控监控：提供风险控制所需的基础数据结构
 *          
 *          这些数据结构为风控系统提供了全面的监控数据支持，
 *          包括交易量统计、订单统计、撤单统计和资金动态监控等。
 */
#pragma once
#include "WTSObject.hpp"

NS_WTP_BEGIN

/*!
 * \brief 交易统计信息结构体
 * 
 * \details 记录单个品种的详细交易统计信息，包括：
 *          - 开平统计：多空开仓、平仓、平今交易量
 *          - 报单统计：买卖委托订单数量和委托量
 *          - 撤单统计：买卖撤单数量和撤单量
 *          - 自动撤单统计：系统自动撤单的统计
 *          - 错单统计：交易过程中的错误订单统计
 *          
 *          这些统计数据是风控系统进行风险评估和限制的重要依据
 */
typedef struct _TradeStatInfo
{
	char		_code[MAX_INSTRUMENT_LENGTH];	//合约代码
	
	//开平统计
	double	l_openvol;		//多头开仓总量
	double	l_closevol;		//多头平仓总量
	double	l_closetvol;	//多头平今总量
	double	s_openvol;		//空头开仓总量
	double	s_closevol;		//空头平仓总量
	double	s_closetvol;	//空头平今总量

	//报单统计
	uint32_t	b_orders;	//买入委托次数
	double		b_ordqty;	//买入委托总量
	uint32_t	s_orders;	//卖出委托次数
	double		s_ordqty;	//卖出委托总量

	//撤单统计
	uint32_t	b_cancels;	//买入撤单次数
	double		b_canclqty;	//买入撤单总量
	uint32_t	s_cancels;	//卖出撤单次数
	double		s_canclqty;	//卖出撤单总量

	//自动撤单统计
	uint32_t	b_auto_cancels;		//买入自动撤单次数
	double		b_auto_canclqty;	//买入自动撤单总量
	uint32_t	s_auto_cancels;		//卖出自动撤单次数
	double		s_auto_canclqty;	//卖出自动撤单总量

	//错单统计
	uint32_t	b_wrongs;	//买入错单次数
	double		b_wrongqty;	//买入错单总量
	uint32_t	s_wrongs;	//卖出错单次数
	double		s_wrongqty;	//卖出错单总量

	/*!
	 * \brief 默认构造函数
	 * 
	 * \details 将所有统计数据初始化为0
	 */
	_TradeStatInfo()
	{
		memset(this, 0, sizeof(_TradeStatInfo));
	}
} TradeStatInfo;

/*!
 * \brief 交易状态信息类
 * 
 * \details 封装TradeStatInfo结构体的WTSObject派生类，提供：
 *          - 对象生命周期管理：继承自WTSObject的引用计数机制
 *          - 静态工厂方法：通过create()方法创建实例
 *          - 数据访问接口：提供各种统计数据的getter方法
 *          - 汇总统计：提供总计数据的计算方法
 *          
 *          该类是风控系统中用于跟踪单个品种交易活动的核心数据结构
 */
class WTSTradeStateInfo : public WTSObject
{
protected:
	/*!
	 * \brief 受保护的构造函数
	 * 
	 * \details 防止直接实例化，只能通过create()静态方法创建
	 */
	WTSTradeStateInfo(){}

public:
	/*!
	 * \brief 创建交易状态信息对象
	 * 
	 * \param code 合约代码
	 * \return 新创建的WTSTradeStateInfo对象指针
	 * 
	 * \details 静态工厂方法，创建并初始化交易状态信息对象
	 */
	static WTSTradeStateInfo* create(const char* code)
	{
		WTSTradeStateInfo* pRet = new WTSTradeStateInfo();
		wt_strcpy(pRet->_trd_stat_info._code, code);

		return pRet;
	}

	/*!
	 * \brief 获取统计信息引用
	 * \return 交易统计信息结构体的引用
	 */
	inline TradeStatInfo&	statInfo(){ return _trd_stat_info; }
	
	/*!
	 * \brief 获取统计信息常量引用
	 * \return 交易统计信息结构体的常量引用
	 */
	inline const TradeStatInfo& statInfo() const{ return _trd_stat_info; }

	/*!
	 * \brief 获取合约代码
	 * \return 合约代码字符串
	 */
	inline const char* code() const{ return _trd_stat_info._code; }

	// 开平仓交易量访问方法
	inline double open_volume_long() const{ return _trd_stat_info.l_openvol; }		//多头开仓量
	inline double close_volume_long() const{ return _trd_stat_info.l_closevol; }	//多头平仓量
	inline double closet_volume_long() const{ return _trd_stat_info.l_closetvol; }	//多头平今量
	inline double open_volume_short() const{ return _trd_stat_info.s_openvol; }		//空头开仓量
	inline double close_volume_short() const{ return _trd_stat_info.s_closevol; }	//空头平仓量
	inline double closet_volume_short() const{ return _trd_stat_info.s_closetvol; }	//空头平今量

	// 委托订单统计访问方法
	inline uint32_t orders_buy() const{ return _trd_stat_info.b_orders; }		//买入委托次数
	inline double ordqty_buy() const{ return _trd_stat_info.b_ordqty; }		//买入委托总量
	inline uint32_t orders_sell() const{ return _trd_stat_info.s_orders; }		//卖出委托次数
	inline double ordqty_sell() const{ return _trd_stat_info.s_ordqty; }		//卖出委托总量

	// 撤单统计访问方法
	inline uint32_t cancels_buy() const{ return _trd_stat_info.b_cancels; }	//买入撤单次数
	inline double cancelqty_buy() const{ return _trd_stat_info.b_canclqty; }	//买入撤单总量
	inline uint32_t cancels_sell() const{ return _trd_stat_info.s_cancels; }	//卖出撤单次数
	inline double cancelqty_sell() const{ return _trd_stat_info.s_canclqty; }	//卖出撤单总量

	// 汇总统计方法
	inline uint32_t total_cancels() const{ return _trd_stat_info.b_cancels + _trd_stat_info.s_cancels; }	//总撤单次数
	inline uint32_t total_orders() const { return _trd_stat_info.b_orders + _trd_stat_info.s_orders; }		//总委托次数

private:
	TradeStatInfo	_trd_stat_info;	//交易统计信息数据
};

/*!
 * \brief 资金信息结构体
 * 
 * \details 记录账户的详细资金状态信息，包括：
 *          - 权益信息：昨日和当日的静态、动态权益
 *          - 盈亏信息：平仓盈亏和浮动盈亏
 *          - 费用信息：交易手续费统计
 *          - 历史极值：资金的历史最高和最低点
 *          - 更新时间：数据的最后更新时间
 *          
 *          这些数据是风控系统进行资金管理和风险控制的基础
 */
typedef struct _WTSFundStruct
{
	double		_predynbal;		//昨日动态权益
	double		_prebalance;	//昨日静态权益
	double		_balance;		//静态权益
	double		_profit;		//平仓盈亏
	double		_dynprofit;		//浮动盈亏
	double		_fees;			//手续费
	uint32_t	_last_date;		//上次结算交易日

	double		_max_dyn_bal;	//最大动态权益值
	uint32_t	_max_time;		//达到最高点的时间
	double		_min_dyn_bal;	//最小动态权益值
	uint32_t	_min_time;		//达到最低点的时间

	int64_t		_update_time;	//数据更新时间

	/*!
	 * \brief 动态权益配对结构
	 * 
	 * \details 记录特定日期的动态权益值，用于跟踪历史极值
	 */
	typedef struct _DynBalPair
	{
		uint32_t	_date;			//日期
		double		_dyn_balance;	//动态权益

		/*!
		 * \brief 默认构造函数
		 * 
		 * \details 初始化所有数据为0
		 */
		_DynBalPair()
		{
			memset(this, 0, sizeof(_DynBalPair));
		}
	} DynBalPair;

	DynBalPair	_max_md_dyn_bal;	//最大动态权益值
	DynBalPair	_min_md_dyn_bal;	//最小动态权益值

	/*!
	 * \brief 默认构造函数
	 * 
	 * \details 初始化资金结构体，将极值设置为最大值作为初始状态
	 */
	_WTSFundStruct()
	{
		memset(this, 0, sizeof(_WTSFundStruct));
		_max_dyn_bal = DBL_MAX;
		_min_dyn_bal = DBL_MAX;
	}
} WTSFundStruct;

/*!
 * \brief 组合资金信息类
 * 
 * \details 封装WTSFundStruct结构体的WTSObject派生类，提供：
 *          - 对象生命周期管理：继承自WTSObject的引用计数机制
 *          - 静态工厂方法：通过create()方法创建实例
 *          - 资金数据访问：提供各种资金信息的getter方法
 *          - 风控监控：为风控系统提供实时资金状态
 *          
 *          该类是风控系统中用于监控账户资金状态的核心数据结构，
 *          支持实时盈亏计算、资金极值跟踪和风险控制决策
 */
class WTSPortFundInfo : public WTSObject
{
protected:
	/*!
	 * \brief 受保护的构造函数
	 * 
	 * \details 防止直接实例化，只能通过create()静态方法创建
	 */
	WTSPortFundInfo(){}

public:
	/*!
	 * \brief 创建组合资金信息对象
	 * 
	 * \return 新创建的WTSPortFundInfo对象指针
	 * 
	 * \details 静态工厂方法，创建并初始化组合资金信息对象
	 */
	static WTSPortFundInfo* create()
	{
		WTSPortFundInfo* pRet = new WTSPortFundInfo();
		return pRet;
	}

	/*!
	 * \brief 获取资金信息引用
	 * \return 资金信息结构体的引用
	 */
	WTSFundStruct&	fundInfo(){ return _fund_info; }
	
	/*!
	 * \brief 获取资金信息常量引用
	 * \return 资金信息结构体的常量引用
	 */
	const WTSFundStruct& fundInfo() const{ return _fund_info; }

	// 基础资金信息访问方法
	double predynbalance() const{ return _fund_info._predynbal; }	//昨日动态权益
	double balance() const{ return _fund_info._balance; }			//静态权益
	double profit() const{ return _fund_info._profit; }				//平仓盈亏
	double dynprofit() const{ return _fund_info._dynprofit; }		//浮动盈亏
	double fees() const{ return _fund_info._fees; }					//手续费

	// 极值信息访问方法
	double max_dyn_balance() const{ return _fund_info._max_dyn_bal; }	//最大动态权益
	double min_dyn_balance() const{ return _fund_info._min_dyn_bal; }	//最小动态权益

	double max_md_dyn_balance() const{ return _fund_info._max_md_dyn_bal._dyn_balance; }	//最大动态权益值
	double min_md_dyn_balance() const{ return _fund_info._min_md_dyn_bal._dyn_balance; }	//最小动态权益值

	// 时间信息访问方法
	uint32_t max_dynbal_time() const{ return _fund_info._max_time; }		//最高点时间
	uint32_t min_dynbal_time() const{ return _fund_info._min_time; }		//最低点时间

	uint32_t last_settle_date() const{ return _fund_info._last_date; }		//上次结算日期

	uint32_t max_md_dynbal_date() const{ return _fund_info._max_md_dyn_bal._date; }	//最大动态权益日期
	uint32_t min_md_dynbal_date() const{ return _fund_info._min_md_dyn_bal._date; }	//最小动态权益日期

private:
	WTSFundStruct	_fund_info;	//资金信息数据
};

NS_WTP_END